Fault tolerance may be implemented on some computer systems by executing the same software application in lock-step as between two processors. In some cases the lock-step operation may be cycle-by-cycle or strict lock-step. However, because of non-deterministic behavior of processors (e.g., branch prediction, speculative fetching, and out or order processing), operation may be lock-step, but not strict lock-step. In such systems the processors execute duplicate copies of the same code, but not necessarily in a cycle-by-cycle fashion or at the same wall clock time. Lock-step operation that is not cycle-by-cycle or at the same wall clock time may be referred to as “loose lock-step.”
In loose lock-step systems, difficulties arise in ensuring that execution points within the duplicate copies of the software application do not get too far removed from one another. Relatedly, handling of interrupts generated external to the processors becomes problematic.